Subroutine to calculate a covariance matrix of observations from a semivariogram model and a vector of separation distances.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=float), | intent(in), | DIMENSION(:,:) | :: | dist |
separation distance vector |
|
real(kind=float), | intent(in), | DIMENSION(:,:) | :: | theta |
anisotropy angle ?? |
|
real(kind=float), | intent(out), | DIMENSION(:,:) | :: | cov |
covariance matrix |
|
real(kind=float), | intent(in) | :: | sill |
partial sill (total sill - nugget) from automatic fitting |
||
real(kind=float), | intent(in) | :: | range |
range from automatic fitting |
||
integer(kind=short), | intent(in) | :: | varmodel |
semivariogram model: 1 = spherical, 2 = exponential, 3 = gaussian, 4 = power |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
real(kind=float), | public, | DIMENSION(SIZE(dist,1),SIZE(dist,2)) | :: | h_prime | |||
integer(kind=short), | public | :: | i |
SUBROUTINE Covariance2D & ! (dist, theta, cov, sill, range, varmodel) IMPLICIT NONE !Arguments with intent(in) REAL (KIND = float), INTENT(in) :: sill !! partial sill (total sill - nugget) from automatic fitting REAL (KIND = float), INTENT(in) :: range !! range from automatic fitting REAL (KIND = float), DIMENSION(:,:), INTENT(IN) :: dist !!separation distance vector REAL (KIND = float), DIMENSION(:,:), INTENT(IN) :: theta !!anisotropy angle ?? INTEGER (KIND = short), INTENT(in) :: varmodel !!semivariogram model: 1 = spherical, 2 = exponential, 3 = gaussian, 4 = power !Arguments with intent(out): REAL (KIND = float), DIMENSION(:,:), INTENT(OUT) :: cov !!covariance matrix !Local variable declarations REAL (KIND = float), DIMENSION(SIZE(dist,1),SIZE(dist,2)) :: h_prime INTEGER (KIND = short) :: i !---------------------------------end of declarations-------------------------- !h_prime = dist ! da correggere con anisotropia quando sarĂ implementata !Check for anisotropy IF (anisotropyAngle == 0.) THEN h_prime = dist ELSE !Transform distance vector by applying anisotropy correction factor h_prime = dist + dist * ABS( SIN( theta - anisotropyAngle ) * anisotropyRatio ) END IF !covariance = nugget + partialsill - semivariogram(h) !since semivariogram(h) = nugget + partialsill * f(h,range) => covariance = partialsill * ( 1- f(h,range) ) SELECT CASE(varmodel) CASE (1) !Spherical WHERE(h_prime < range) cov = sill * (1. - ( 1.5 * (h_prime / range) - 0.5 * (h_prime / range)**3. ) ) ELSEWHERE cov = 0. END WHERE CASE (2) !Exponential WHERE(h_prime < range) !cov = sill * (1. - ( 1. - EXP (- h_prime / range) ) ) cov = sill * (1. - ( 1. - EXP (- 3* h_prime / range) ) ) ELSEWHERE cov = 0. END WHERE CASE (3) !Gaussian: MUST have a nugget effect to function without instability WHERE(h_prime < range) !cov = sill * (1. - ( 1. - EXP (- h_prime * h_prime / (range * range) ) ) ) cov = sill * (1. - ( 1. - EXP (- 10 * h_prime * h_prime / (range * range) ) ) ) ELSEWHERE cov = 0. END WHERE CASE (4) !Power WHERE(h_prime < range) cov = sill * (1. - (h_prime / range) ) ELSEWHERE cov = 0. END WHERE END SELECT RETURN END SUBROUTINE Covariance2D